package com.archerdu.commons.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.archerdu.base.dao.IPage;

/**
 * html页面处理类
 * 
 * @projectName springDemo
 * @description html页面处理类
 * @author archer du
 * @createDate 2013年9月27日 下午5:20:43
 * @updateUser dxf
 * @updateDate 2013年9月27日 下午5:20:43
 * @updateRemark 新建
 * @version 0.0.1
 */
public class HtmlUtil {

    public static final String TARGET_BLANK = "_blank";
    public static final String TARGET_SELF  = "_self";

    /**
     * 返回没有标签的html文本
     * 
     * @param htmlStr
     * @return
     */
    public static String delHTMLTag(String htmlStr) {
        String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
        String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; // 定义style的正则表达式
        String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
        String regEx_space = "&nbsp;"; // 定义空格实体的正则表达式

        Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
        Matcher m_script = p_script.matcher(htmlStr);
        htmlStr = m_script.replaceAll(""); // 过滤script标签

        Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
        Matcher m_style = p_style.matcher(htmlStr);
        htmlStr = m_style.replaceAll(""); // 过滤style标签

        Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
        Matcher m_html = p_html.matcher(htmlStr);
        htmlStr = m_html.replaceAll(""); // 过滤html标签

        Pattern p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
        Matcher m_space = p_space.matcher(htmlStr);
        htmlStr = m_space.replaceAll(" "); // 过滤html标签

        return htmlStr.trim(); // 返回文本字符串
    }

    /**
     * 显示分页标签
     * 
     * @param url
     * @param page
     * @param showNums
     * @param target
     * @return
     */
    public static String pageTag(String url, IPage<Object> page, int showNums, String target) {
        return pageTag(url, page.getPageNo(), page.getPageSize(), page.getTotal(), showNums, target);
    }

    /**
     * 
     * 显示分页标签
     * 
     * @param url
     *            链接
     * @param pageNo
     *            页码
     * @param pageSize
     *            每页条数， 默认20
     * @param total
     *            记录总数
     * @param showNums
     *            显示页码长度，默认10
     * @param target
     *            新页面打开方式，用户a标签
     * @return
     * 
     *         参考样式：<br /> a.page_end{display:inline-block; width:40px;
     *         height:20px;} a.page_num{display:inline-block; width:30px;
     *         height:20px;} a.page_focus{display:inline-block; width:30px;
     *         height:20px; font-weight:600;}
     *         span.page_count{display:inline-block; height:20px;}
     */
    public static String pageTag(String url, int pageNo, int pageSize, Long total, int showNums, String target) {

        url += url.indexOf("?") == -1 ? "?" : "&";
        if (pageNo < 1)
            pageNo = 1;
        if (pageSize < 1)
            pageSize = 20;
        if (total < 0L)
            total = 0L;
        if (showNums < 1) {
            showNums = 10;
        }
        // 总页数
        int num = Math.round((total + pageSize - 1) / pageSize);
        int begin = 1;

        if (pageNo > num)
            pageNo = num;

        StringBuffer sb = new StringBuffer("");

        // 判断分页起始标示，不是1位，添加首页标示
        if (pageNo > 5 && num > 10) {
            begin = pageNo - 4;
            sb.append("<a class=\"page_end\" href=\"" + url + "pageNo=1&pageSize=" + pageSize + "\">首页</a>");
            if (begin > num - 9) {
                begin = num - 9;
            }
        }

        // 判断分页结束标示，每组不够10位，则显示实际数目
        int end = begin + 10;
        if (begin + 10 > num || num <= 10) {
            end = num + 1;
        }

        for (int i = begin; i < end; i++) {
            if (i == pageNo)
                sb.append("<a class=\"page_focus\" href=\"" + url + "pageNo=" + i + "&pageSize=" + pageSize + "\" />"
                        + i + "</a>");
            else
                sb.append("<a class=\"page_num\" href=\"" + url + "pageNo=" + i + "&pageSize=" + pageSize + "\" />" + i
                        + "</a>");
        }
        // 总数大于分组则显示尾页标示
        if (num >= begin + 10) {
            sb.append("<a class=\"page_end\" href=\"" + url + "pageNo=" + num + "&pageSize=" + pageSize + "\">尾页</a>");
        }
        sb.append("<span class=\"page_count\" >共" + num + "页 共" + total + "条记录</span>");
        return sb.toString();
    }

    /**
     * Html编码转换（&#数字型）
     * 
     * @param str
     * @return
     */
    public static String decode(String str) {
        String[] tmp = str.split(";&#|&#|;");
        StringBuffer sb = new StringBuffer("");

        for (int i = 0; i < tmp.length; i++) {
            if (tmp[i].matches("\\d{5}")) {
                sb.append((char) Integer.parseInt(tmp[i]));
            } else {
                sb.append(tmp[i]);
            }
        }
        return sb.toString();
    }

    public static void main(String args[]) {
        System.out.println(HtmlUtil.pageTag("/aa/", 1, 20, 0L, 10, TARGET_BLANK) + "<hr />");
        System.out.println(HtmlUtil.pageTag("/aa/", 1, 20, 35L, 10, TARGET_BLANK) + "<hr />");
        System.out.println(HtmlUtil.pageTag("/aa/", 1, 20, 135L, 10, TARGET_BLANK) + "<hr />");
        System.out.println(HtmlUtil.pageTag("/aa/", 1, 20, 1335L, 10, TARGET_BLANK) + "<hr />");
        System.out.println(HtmlUtil.pageTag("/aa/", 12, 20, 1335L, 10, TARGET_BLANK) + "<hr />");
        System.out.println(HtmlUtil.pageTag("/aa/", 65, 20, 1335L, 10, TARGET_BLANK) + "<hr />");
    }
}
